package com.zyx.javademo.exception;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author Yaxi.Zhang
 * @since 2021/9/28 17:34
 * desc: 利用线程池解决单线程中
 * reference: https://honeypps.com/java/java-multi-thread-of-uncaught-exception-handler/
 * {@link NoCaughtThread} 中介绍了多线程中捕获异常出现的问题
 *  那么如何在线程池内部构建一个工作者线程呢?
 *      如果任务抛出了一个未检查异常, 那么它将使线程终结, 但会首先通知框架该现场已经终结
 *      然后框架可能会用新的线程来代替这个工作线程, 也可能不会, 因为线程池正在关闭, 或者当前已有足够多的线程能满足需要
 *      当编写一个向线程池提交任务的工作者类线程类时, 或者调用不可信的外部代码时(例如动态加载的插件),
 *      使用这些方法中的某一种可以避免某个编写得糟糕的任务或插件不会影响调用它的整个线程
 */
public class InitiativeCaught {
    public void threadDeal(Runnable r, Throwable t) {
        System.out.println("==Exception: " + t.getMessage());
    }

    class InitialtiveThread implements Runnable {
        @Override
        public void run() {
            Throwable thrown = null;
            try {
                System.out.println(3 / 2);
                System.out.println(3 / 0);
                System.out.println(3 / 1);
            } catch (Throwable e) {
                thrown = e;
            } finally {
                threadDeal(this, thrown);
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        exec.execute(new InitiativeCaught().new InitialtiveThread());
        exec.shutdown();
    }
}
